package cn.gz.lbs.glsc;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.netnewera.l1.ans.Ans;
import com.netnewera.l1.ans.Lia;
import com.netnewera.l1.ans.Posinfo;
import com.netnewera.l1.req.Lir;
import com.netnewera.l1.req.Req;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;


import cn.gz.zoomtech.common.ConfManager;

/**
 * 测试用：模仿GLSC服务端
 *        返回单次立即定位请求
 *        的管理器。
 * @author Administrator
 *
 */
public class GLSCResponseManager {
	
	 private static final Log log = LogFactory.getLog(GLSCResponseManager.class);
	 private static CompositeConfiguration cf = ConfManager.getInstance().getConf();

	/**
	 * package_name: test
	 * file_name:    GLSCResponseManager.java
	 * description: 
	 * 2013-6-28下午2:42:22
	 * Author: chenhui
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	
	/**
	 * 
	* package_name: cn.gz.lbs.glsc
	* file_name:    GLSCResponseManager.java
	* description: GLSC解析客户端送来的REQ请求字符串，
	*              返回带LIA的响应字符串。
	* 2013-6-28下午3:34:32
	* Author: chenhui
	 * @param reqStr (带消息头)
	 * @return  respStr (带消息头)
	 */
	public  String getGlscResp(String reqStr){
		
		String headStr = "<?xml version=\"1.0\"?><!DOCTYPE REQ SYSTEM \"LOCREQ.DTD\">";
		Req reqObject  = null;
		String respStr = null;
		try{
			XStream xStream = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
			xStream.autodetectAnnotations(true);
//			step0:将请求字符串转换成请求REQ对象
			reqObject = new Req();
			String noHeadReq = reqStr.replace(headStr, "");
			log.info("noHeadReqIn_getGlscResp is:"+noHeadReq);
			xStream.alias("REQ",Req.class);
			reqObject = (Req)xStream.fromXML(noHeadReq);
//			step1:业务规则：LBSC与GLSC之间，只有单次LIR请求，所以，此处代码仅当LGSC传来的请求是单次LIR请求来进行解析，
//			               并根据请求的号码，做简单的返回处理。
			String lcsClientId = reqObject.getClient().getLcsclientid();
			String orid = reqObject.getOriginator().getOrid();
			
			Lir lirOne = (Lir)reqObject.getLir();
			List msidList = lirOne.getMsids().getMsid();
			String tel = (String)msidList.get(0);
//			构建ANS
			Ans ans = new Ans();
			ans.setLcsclientid(lcsClientId+"GLSC");
			ans.setOrid(orid+"GLSC");
			
//			构建lia对象。
			Lia lia = new Lia();
			
			List<Posinfo> list = new ArrayList<Posinfo>();
//			位置信息start    
			Posinfo p = new Posinfo();
			p.setPositionresult("1");			
			p.setMsid(tel);
			p.setMsidtype("0");
			
			if("13760654681".equals(tel)){
				p.setAreacode("21");
				p.setLocaltime("20130628143021");
				p.setLatitudetype("1"); // 【注释：0:南纬；1:北纬】
				p.setLatitude("301628.111"); // 纬度
				p.setLongitudetype("1"); // 【注释：0:东经，1:西经】
				p.setLongitude("451533.431"); // 经度 【注释：经纬度数据单位采用十万分之一度】
			}else{
				p.setAreacode("22");
				p.setLocaltime("20130628143022");
				p.setLatitudetype("0"); // 【注释：0:南纬；1:北纬】
				p.setLatitude("301628.312"); // 纬度
				p.setLongitudetype("0"); // 【注释：0:东经，1:西经】
				p.setLongitude("451533.432"); // 经度 【注释：经纬度数据单位采用十万分之一度】
			}
			
			
			p.setRadius("200"); // 位置信息返回的扇区半径信息
			p.setPosour("6");   // 定义位置来源 
//			0	未使用
//			6	网络小区号
//			18	手机AGPS（包括AGPS+AFLT的混合模式）
//			20	手机AFLT
			p.setDirection("120"); // 用于定义被定位MS移动的方向（度）
//			位置信息end
			
			list.add(p);
			lia.setPosinfos(list);
			lia.setResult("0");
			
			ans.setLia(lia);
			respStr = xStream.toXML(ans);
			
			log.info("glscReturnStr:"+respStr);
			
		}catch(Exception ex){
			ex.printStackTrace();
			log.error("glscErrorIs:",ex);
			respStr = "error";
		}
        return respStr;
	}
	
	
	
	

}
